
var Trait=function(){};
Trait.prototype.cumple=function(arrayParam) {
	//trait por q no vamos a usar estado en este caso, js puede usar los prototypes as mixins
	//usamos las primitivas para podeer evitar un falso resultado del tipo
	// new Boolean(true) = false --> da true (agregar pag libro) 
    if(!arrayParam.length)
    {
	return true;
    }
    
    for(var i=0; i<arrayParam.length; i++)
    {
	if(this.caracteristicas.indexOf(arrayParam[i])<0){
		//no es miedo al boolean, es un recorrido
		return false;	
		}
	}	
	return true;
};




//esta es la estructura comun de nuestros AUla, Caracteristica, Curso
//TODO: meter un closure para no poder acceder a las variables, pero chequear si se heredan 
var EstructuraComun=function(){
};
EstructuraComun.prototype={
		// no es necesario definir aca las variables de estado, le dejo a modo de "regla" .. no 
		// no es necesario x q en los contructores q vana usar esto ya se define
		id: "",
		caracteristicas: null,
		getId: function() { return this.id;},
		getCaracteristicas: function() {return this.caracteristicas;}		
};

var Caracteristica=function(nom, paramCaracteristicasArray){
	this.id = nom;
	this.caracteristicas=paramCaracteristicasArray;
};

//ojo para definir el prototype con un new... esa clase debe estar antes!!!!
Caracteristica.prototype= new EstructuraComun();
Caracteristica.prototype.cumple=Trait.prototype.cumple;

var Aula=function(paramId, paramCapacidad, paramCaracteristicasArray)
{	//se podria hacer un constructor, q reciba n strings y arme un array con los elementos 2 al ultimo
	this.id=paramId;
	this.capacidad=paramCapacidad;
	this.caracteristicas=paramCaracteristicasArray;
};

Aula.prototype = new EstructuraComun();
Aula.prototype.cumple=Trait.prototype.cumple;
Aula.prototype.cumpleTodoBis=function f(){
	var ret = new Boolean(true);			    
	if(!arguments.length)	
		{
			return ret;
		}

	if(1==arguments.length)	
		{
		
			return ret&&(arguments[0]<=this.capacidad);
		}else {
			return ret&&this.cumple()&&(arguments[0]<=this.capacidad);
		}
};

Aula.prototype.cumpleTodo=function f(){
	var ret = new Boolean(true);			    
	if(!arguments.length)	
		{
			return ret;
		}

	if(1==arguments.length)	
		{
		
			ret = ret&&(arguments[0]<=this.capacidad);
		}

	for(var i=1; i<arguments.length; i++)
    	{
		if(this.caracteristicas.indexOf(arguments[i])<0){
			return new Boolean(false);
		}	
	}
	return ret;
};

var AulaMultimedia = {
		
};
AulaMultimedia.prototype = new Aula();




var AulaLaboratorio = {};
AulaLaboratorio.prototype = new Aula();



var Curso=function(id,caractList){
	this.id = id;
	this.caracteristicas = caractList;
	this.aula = null; // una vez asignado se guarda el aula
	//tiene una lista de caracteristicas pero representan las REQUERIDAS
};
Curso.prototype = new EstructuraComun();
Curso.prototype.requiere=Trait.prototype.cumple;

var Asignador=function(aulasList, cursosList){
	console.log(typeof aulasList.pop().id);
	this.aulasDisponibles=aulasList;
	this.cursos=cursosList;
	this.resultado= new Array(); // la idea es q cada curso sea key de una lista de aulas posibles
	
};

Asignador.prototype.asignar=function(){
	document.write("cursos len: "+this.cursos.length);
	document.write("aulass len: "+this.aulasDisponibles.length);

	for ( var curso in this.cursos) {
		document.write("cursos typeof: "+typeof curso);
		this.resultado[curso]=new Array();
		
		for ( var aula in this.aulasDisponibles) {
			if(aula.cumple(curso.getCaracteristicas())){
				this.resultado[curso].concat(aula);
			}
		}
	}
};


var aula1 = new Aula(1,23,[]);

